//
// Created by dong on 2025/11/3.
//

#ifndef LINUXSTUDY_THREAD_POOL_H
#define LINUXSTUDY_THREAD_POOL_H
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <sys/poll.h>

#define MAX_THREAD_NUM 200
#define MIN_THREAD_NUM 3
#define DEFAULT_THREAD_NUM 10
#define MANAGER_INTERVAL 5

// 线程的工作函数和参数
typedef struct {
    void* (*process_job)(void* arg);
    void* arg;
} tp_work;

// 线程信息结构
typedef struct tp_thread_info_s {
    pthread_t thread_id;
    int status;          // 线程状态 1忙 0闲
    int need_exit;      // 退出标记 1退出 0不退出
    pthread_mutex_t thread_lock;
    pthread_cond_t thread_cond;

    tp_work* th_work;
    struct tp_thread_info_s* next;
    struct tp_thread_info_s* prev;
} tp_thread_info;

// 线程池结构
typedef struct tp_thread_pool_s {
    int min_th_num;         // 最小线程数
    int cur_th_num;         // 当前线程数
    int max_th_num;         // 最大线程数
    int idle_th_num;        // 空闲线程数
    int active_th_num;      // 活跃线程数
    pthread_mutex_t tp_lock;
    pthread_t manage_thread_id;

    tp_thread_info* thread_info;    // 线程链表头节点
    int shutdown;                   // 线程池关闭标志
} tp_thread_pool;

// 函数声明
tp_thread_pool* create_thread_pool(int min, int max);
int tp_add_job(tp_thread_pool* pool, void* (*process_job)(void* arg), void* arg);
int tp_destroy(tp_thread_pool* pool);

// 工作线程函数
void* thread_worker(void* arg);
// 管理线程函数
void* tp_manager_thread(void* arg);
// 创建新线程
tp_thread_info* tp_add_pthread(tp_thread_pool* pool);
// 初始化线程
int init_thread(tp_thread_pool* pool, tp_thread_info* info);
#endif //LINUXSTUDY_THREAD_POOL_H